package com.fy.proj2_login_api.util;

import java.util.Base64;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

// 令牌工具类，用于生成和验证用户认证令牌
@Component
public class TokenUtil {
    // 从配置文件中读取令牌密钥
    @Value("${token.secret}")
    private String secret;

    // 从配置文件中读取令牌过期时间（单位：秒）
    @Value("${token.expiration}")
    private Long expiration;

    // 生成令牌
    public String generateToken(String username, String role) {
        // 简单token生成: 用户名:角色:过期时间:签名
        // 计算令牌过期时间（当前时间 + 配置的过期时间）
        long expirationTime = System.currentTimeMillis() + expiration * 1000;
        // 构建令牌数据部分
        String tokenData = username + ":" + role + ":" + expirationTime;
        // 生成数据签名
        String signature = generateSignature(tokenData);
        // 将数据部分和签名组合后进行Base64编码
        return Base64.getEncoder().encodeToString((tokenData + ":" + signature).getBytes());
    }

    // 从令牌中提取用户名
    public String extractUsername(String token) {
        try {
            // 对令牌进行Base64解码
            String decoded = new String(Base64.getDecoder().decode(token));
            // 按冒号分割令牌内容
            String[] parts = decoded.split(":");
            // 返回第一部分（用户名）
            return parts.length >= 1 ? parts[0] : null;
        } catch (Exception e) {
            // 解码失败返回null
            return null;
        }
    }

    // 从令牌中提取用户角色
    public String extractRole(String token) {
        try {
            // 对令牌进行Base64解码
            String decoded = new String(Base64.getDecoder().decode(token));
            // 按冒号分割令牌内容
            String[] parts = decoded.split(":");
            // 返回第二部分（用户角色）
            return parts.length >= 2 ? parts[1] : null;
        } catch (Exception e) {
            // 解码失败返回null
            return null;
        }
    }

    // 验证令牌是否有效
    public boolean validateToken(String token, String username) {
        try {
            // 对令牌进行Base64解码
            String decoded = new String(Base64.getDecoder().decode(token));
            // 按冒号分割令牌内容
            String[] parts = decoded.split(":");
            // 如果令牌格式不正确（部分数量不足），返回false
            if (parts.length < 4) return false;

            // 提取令牌中的用户名
            String tokenUsername = parts[0];
            // 提取令牌中的过期时间
            long expirationTime = Long.parseLong(parts[2]);
            // 提取令牌中的签名
            String signature = parts[3];
            // 重新构建令牌数据部分（不含签名）
            String tokenData = parts[0] + ":" + parts[1] + ":" + parts[2];

            // 验证用户名、过期时间和签名
            // 1. 验证用户名是否匹配
            // 2. 验证令牌是否过期
            // 3. 验证签名是否正确
            return username.equals(tokenUsername) &&
                   System.currentTimeMillis() < expirationTime &&
                   signature.equals(generateSignature(tokenData));
        } catch (Exception e) {
            // 验证过程中出现异常，返回false
            return false;
        }
    }

    // 生成数据签名
    private String generateSignature(String data) {
        // 简单签名生成: 使用secret对数据进行简单加密
        // 将数据和密钥组合后进行Base64编码
        return Base64.getEncoder().encodeToString((data + secret).getBytes());
    }
}